home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet internetowy / Rozne / HTTrack 3.40-2 / httrack-3.40-2.exe / {app} / src / proxy / proxytrack.h < prev    next >
C/C++ Source or Header  |  2006-04-09  |  8KB  |  289 lines

  1. /* ------------------------------------------------------------ */
  2. /*
  3. HTTrack Website Copier, Offline Browser for Windows and Unix
  4. Copyright (C) Xavier Roche and other contributors
  5.  
  6. This program is free software; you can redistribute it and/or
  7. modify it under the terms of the GNU General Public License
  8. as published by the Free Software Foundation; either version 2
  9. of the License, or any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  19.  
  20. Please visit our Website: http://www.httrack.com
  21. */
  22.  
  23. /* ------------------------------------------------------------ */
  24. /* File: ProxyTrack, httrack cache-based proxy                  */
  25. /* Author: Xavier Roche                                         */
  26. /* ------------------------------------------------------------ */
  27.  
  28. #ifndef WEBHTTRACK_PROXYTRACK
  29. #define WEBHTTRACK_PROXYTRACK
  30.  
  31. /* Version */
  32. #define PROXYTRACK_VERSION "0.4"
  33.  
  34. /* Store manager */
  35. #include "../minizip/mztools.h"
  36. #include "store.h"
  37.  
  38. #include <sys/stat.h>
  39.  
  40. /* generic */
  41.  
  42. int proxytrack_main(char* proxyAddr, int proxyPort, 
  43.                                         char* icpAddr, int icpPort, 
  44.                                         PT_Indexes index);
  45.  
  46. /* Spaces: CR,LF,TAB,FF */
  47. #define  is_space(c)      ( ((c)==' ') || ((c)=='\"') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) || ((c)=='\'') )
  48. #define  is_realspace(c)  ( ((c)==' ')                || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11)                )
  49. #define  is_taborspace(c) ( ((c)==' ')                                          || ((c)==9)                             )
  50. #define  is_quote(c)      (               ((c)=='\"')                                                    || ((c)=='\'') )
  51. #define  is_retorsep(c)   (                              ((c)==10) || ((c)==13) || ((c)==9)                                          )
  52.  
  53. /* Static definitions */
  54.  
  55. #define _ ,
  56. #define CRITICAL_(msg, file, line) do { \
  57.     fprintf(stderr, "* critical: "); \
  58.     fprintf(stderr, msg); \
  59.     fprintf(stderr, " at %s:%d\n", file, line); \
  60.     fflush(stderr); \
  61. } while(0)
  62. #define CRITICAL(msg) do { \
  63.     fprintf(stderr, "* critical: "); \
  64.     fprintf(stderr, msg); \
  65.     fprintf(stderr, " at %s:%d\n", __FILE__, __LINE__); \
  66.     fflush(stderr); \
  67. } while(0)
  68.  
  69. #define WARNING(msg) do { \
  70.     fprintf(stderr, "* warning: "); \
  71.     fprintf(stderr, msg); \
  72.     fprintf(stderr, "\n"); \
  73.     fflush(stderr); \
  74. } while(0)
  75.  
  76. #define LOG(msg) do { \
  77.     fprintf(stderr, "* log: "); \
  78.     fprintf(stderr, msg); \
  79.     fprintf(stderr, "\n"); \
  80.     fflush(stderr); \
  81. } while(0)
  82.  
  83. #if defined(_DEBUG) || defined(DEBUG)
  84. #define DEBUG(msg) do { \
  85.     fprintf(stderr, "* debug: "); \
  86.     fprintf(stderr, msg); \
  87.     fprintf(stderr, "\n"); \
  88.     fflush(stderr); \
  89. } while(0)
  90. #else
  91. #define DEBUG_(msg, file, line) do { } while(0)
  92. #define DEBUG(msg) do { } while(0)
  93. #endif
  94.  
  95. /* Header for generated pages */
  96. #define PROXYTRACK_COMMENT_HEADER \
  97.     "<!-- Generated by ProxyTrack " PROXYTRACK_VERSION " build " __DATE__ " -->\r\n" \
  98.     "<!-- This is an add-on for HTTrack " HTTRACK_VERSIONID " -->\r\n"
  99.  
  100. /* See IE "feature" (MSKB Q294807) */
  101. #define DISABLE_IE_FRIENDLY_HTTP_ERROR_MESSAGES                                            \
  102.     "<!-- Start Disable IE Friendly HTTP Error Messages -->\r\n"            \
  103.     "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
  104.     "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
  105.     "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
  106.     "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
  107.     "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
  108.     "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
  109.     "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
  110.     "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
  111.     "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
  112.     "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
  113.     "<!-- End Disable IE Friendly HTTP Error Messages -->\r\n"
  114.  
  115. static char* gethomedir(void) {
  116.   char* home = getenv( "HOME" );
  117.   if (home)
  118.     return home;
  119.   else
  120.     return ".";
  121. }
  122.  
  123. static int linput(FILE* fp,char* s,int max) {
  124.   int c;
  125.   int j=0;
  126.   do {
  127.     c=fgetc(fp);
  128.     if (c!=EOF) {
  129.       switch(c) {
  130.         case 13: break;  // sauter CR
  131.         case 10: c=-1; break;
  132.         case 0: case 9: case 12: break;  // sauter ces caractΦres
  133.         default: s[j++]=(char) c; break;
  134.       }
  135.     }
  136.   }  while((c!=-1) && (c!=EOF) && (j<(max-1)));
  137.   s[j]='\0';
  138.   return j;
  139. }
  140.  
  141. static int link_has_authority(const char* lien) {
  142.   const char* a=lien;
  143.   if (isalpha((const unsigned char)*a)) {
  144.     // Skip scheme?
  145.     while (isalpha((const unsigned char)*a))
  146.       a++;
  147.     if (*a == ':')
  148.       a++;
  149.     else
  150.       return 0;
  151.   }
  152.   if (strncmp(a,"//",2) == 0)
  153.     return 1;
  154.   return 0;
  155. }
  156.  
  157. static const char* jump_protocol(const char* source) {
  158.   int p;
  159.   // scheme
  160.   // "Comparisons of scheme names MUST be case-insensitive" (RFC2616)
  161.   if ((p = strfield(source,"http:")))
  162.     source+=p;
  163.   else if ((p = strfield(source,"ftp:")))
  164.     source+=p;
  165.   else if ((p = strfield(source,"https:")))
  166.     source+=p;
  167.   else if ((p = strfield(source,"file:")))
  168.     source+=p;
  169.   else if ((p = strfield(source,"mms:")))
  170.     source+=p;
  171.   // net_path
  172.   if (strncmp(source,"//",2)==0)
  173.     source+=2;
  174.   return source;
  175. }
  176.  
  177. static const char* strrchr_limit(const char* s, char c, const char* limit) {
  178.   if (limit == NULL) {
  179.     char* p = strrchr(s, c);
  180.     return p?(p+1):NULL;
  181.   } else {
  182.     char *a=NULL, *p;
  183.     for(;;) {
  184.       p=strchr((a)?a:s, c);
  185.       if ((p >= limit) || (p == NULL))
  186.         return a;
  187.       a=p+1;
  188.     }
  189.   }
  190. }
  191.  
  192. static const char* jump_protocol_and_auth(const char* source) {
  193.   const char *a,*trytofind;
  194.   if (strcmp(source, "file://") == 0)
  195.       return source;
  196.   a = jump_protocol(source);
  197.   trytofind = strrchr_limit(a, '@', strchr(a,'/'));
  198.   return (trytofind != NULL)?trytofind:a;
  199. }
  200.  
  201. #ifndef min
  202. #define min(a,b) ((a)>(b)?(b):(a))
  203. #endif
  204. #ifndef max
  205. #define max(a,b) ((a)>(b)?(a):(b))
  206. #endif
  207. static int linput_trim(FILE* fp,char* s,int max) {
  208.   int rlen=0;
  209.   char* ls=(char*) malloc(max+2);
  210.   s[0]='\0';
  211.   if (ls) {
  212.     char* a;
  213.     // lire ligne
  214.     rlen=linput(fp,ls,max);
  215.     if (rlen) {
  216.       // sauter espaces et tabs en fin
  217.       while( (rlen>0) && is_realspace(ls[max(rlen-1,0)]) )
  218.         ls[--rlen]='\0';
  219.       // sauter espaces en dΘbut
  220.       a=ls;
  221.       while((rlen>0) && ((*a==' ') || (*a=='\t'))) {
  222.         a++;
  223.         rlen--;
  224.       }
  225.       if (rlen>0) {
  226.         memcpy(s,a,rlen);      // can copy \0 chars
  227.         s[rlen]='\0';
  228.       }
  229.     }
  230.     //
  231.     free(ls);
  232.   }
  233.   return rlen;
  234. }
  235.  
  236. // copy of concat
  237. #define HTS_URLMAXSIZE 1024
  238. typedef struct concat_strc {
  239.   char buff[16][HTS_URLMAXSIZE*2*2];
  240.   int rol;
  241. } concat_strc;
  242. static char* concat(const char* a,const char* b) {
  243.   static concat_strc* strc = NULL;
  244.   if (strc == NULL) {
  245.     strc = (concat_strc*) calloc(16, sizeof(concat_strc));
  246.   }
  247.   strc->rol=((strc->rol+1)%16);    // roving pointer
  248.   strcpy(strc->buff[strc->rol],a);
  249.   if (b) strcat(strc->buff[strc->rol],b);
  250.   return strc->buff[strc->rol];
  251. }
  252.  
  253. #ifndef S_ISREG
  254. #define S_ISREG(m) ((m) & _S_IFREG)
  255. #endif
  256. static int fexist(char* s) {
  257.   struct stat st;
  258.   memset(&st, 0, sizeof(st));
  259.   if (stat(s, &st) == 0) {
  260.     if (S_ISREG(st.st_mode)) {
  261.       return 1;
  262.     }
  263.   }
  264.   return 0;
  265.  
  266. #ifndef _WIN32
  267. #define fconv(a) (a)
  268. #define fconcat(a,b) concat(a,b)
  269. #endif
  270.  
  271. #ifdef _WIN32
  272. static char* __fconv(char* a) {
  273.   int i;
  274.   for(i=0;i<(int) strlen(a);i++)
  275.     if (a[i]=='/')  // convertir
  276.       a[i]='\\';
  277.   return a;
  278. }
  279. static char* fconcat(char* a,char* b) {
  280.   return __fconv(concat(a,b));
  281. }
  282. static char* fconv(char* a) {
  283.   return __fconv(concat(a,""));
  284. }
  285. #endif
  286.  
  287. #endif
  288.